perm filename RIMIO[SS,SYS] blob sn#195723 filedate 1976-01-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	RIMIO
C00003 00003	ERRORS:
C00004 00004	INITIALIZATION, DISPATCH
C00007 00005	RTAPE
C00014 00006	THINGS TO WRITE LATER:
C00015 ENDMK
C⊗;
	TITLE	RIMIO

;CONVERTS RIM10B PAPER TAPES TO DMP FILES AND VICE-VERSA

EXTERN JOBSA,JOBREL,JOBSYM,JOBS41

A←1
B←2
C←3
D←4
CHK←13
BLK←14
LNG←15
R←16
P←17

PDLEN←←40

PDLIST:	BLOCK	PDLEN

OFILE:	BLOCK	5			;OFILE+4 IS THE DEVICE.
IFILE:	BLOCK	5			;IFILE+4 IS THE DEVICE
OBUF:	BLOCK	3
IBUF:	BLOCK	3

DMPBUF:	BLOCK	200			;RANDOM ACCESS DUMP IO BUFFER.
HILOC:	0
;ERRORS:

NOENT:	OUTSTR	[ASCIZ/Enter to create output file failed.
/]
	JRST	BEGIN

NOLALT:	OUTSTR	[ASCIZ/Lookup to read-alter the output file failed.
/]
	JRST	BEGIN

NOALT:	OUTSTR	[ASCIZ/Enter to read-alter the output file failed.
/]
	JRST	BEGIN

NOPTR:	OUTSTR	[ASCIZ/OPEN of device PTR: failed.
/]
	JRST	BEGIN

NOOPEN:	OUTSTR	[ASCIZ/OPEN failed
/]
	JRST	BEGIN

;INITIALIZATION, DISPATCH

BEGIN:	RESET
	MOVE	P,[IOWD PDLEN,PDLIST]
RORP:	OUTSTR	[ASCIZ/Read tape or Punch tape?  (Type R or P)  /]
	INCHWL	A
	PUSHJ	P,CLRIN
	TRZ	A,40			;MAKE SURE IT'S UPPERCASE
	CAIN	A,"R"
	JRST	RTAPE
	CAIN	A,"P"
	JRST	PTAPE
	OUTSTR	[ASCIZ/?
/]
	JRST	RORP

CLRIN:	PUSH	P,A
CLRIN1:	CAIE	A,175
	CAIN	A,12
	JRST	APOPJ
	INCHWL	A
	JRST	CLRIN1

;HERE'S HOW THE RIM10B LOADER LOOKS ON THE TAPE:
PTR←←104
;AC 10 CONTAINS (WHEN 5 IS EXECUTED):
;	SOJA	10,4 - INITIAL POINTER OR JRST WORD
;	SOJA	10,3 - MIDDLE OF DATA BLOCK
;	SOJA	10,2 - WHEN READING THE CHECKSUM WORD
;
RIM10B:	-16,,0				; 0  INITIAL BLKI WORD
	CONO	PTR,60			; 1  START PTR IN BINARY MODE
	HRRI	10,4			; 2  INITIALIZE 10 (FOR INDEX AND JUMP ADDR)
	CONSO	PTR,10			; 3  SKIP IF DONE
	JRST	3			; 4  WAIT FOR DONE
	DATAI	PTR,@7(10)		; 5  STORE DATA INDIRECT (13 OR 12 OR 11)
	XCT	7(10)			; 6  EXECUTES 13 OR 12 OR 11
	XCT	12(10)			; 7  EXECUTES 16 OR 15 OR 14
	SOJA	10,0			;10  RH IS CLOBBERED TO 4 OR 3 OR 1
	CAME	17,16			;11  XCTED TO CHECK CHECKSUM
	ADD	17,1(16)		;12  XCTED TO COMPUTE CHECKSUM
	SKIPL	17,16			;13  XCT TO INITIALIZE CHECKSUM AND
					;    SKIP IF THIS IS AN AOBJN WORD
	JRST	4,1			;14  XCT TO HALT IF CHECKSUM FAILS
	AOBJN	16,3			;15  XCT WHILE READING MIDDLE OF DATA BLOCK
	JRST	2			;16  XCTED BY READIN MODE. XCT TO START PRGM
					;17  CHECKSUM IS STORED HERE.

RIMPTR:	RIM10B-.,,RIM10B-1		;IOWD POINTER TO THE RIM10B LOADER
;RTAPE

RTAPE:	OUTSTR	[ASCIZ/Output file name: /]
	MOVEI	R,OFILE
	MOVE	A,[OFILE,,OFILE+1]
	SETZM	OFILE
	BLT	A,OFILE+4
	MOVSI	A,'DMP'
	MOVEM	A,OFILE+1
	PUSHJ	P,GETFIL			;READ FILE NAME FROM USER.

	MOVEI	A,17				;OPEN CHANNEL
	SKIPN	B,OFILE+4
	MOVSI	B,'DSK'
	MOVEI	C,0
	OPEN	1,A
	JRST	NOOPEN
	MOVE	D,[OFILE,,A]
	BLT	D,D
	ENTER	1,A				;SELECT OUTPUT FILE.
	JRST	NOENT	
	CLOSE	1,				;WRITE 0 LENGTH FILE.
	RELEAS	1,
	MOVEI	A,17				;RE-OPEN CHANNEL
	SKIPN	B,OFILE+4
	MOVSI	B,'DSK'
	MOVEI	C,0
	OPEN	1,A
	JRST	NOOPEN
	MOVE	D,[OFILE,,A]
	BLT	D,D
	LOOKUP	1,A				;SEEK FILE WE JUST WROTE
	JRST	NOLALT				;I JUST WROTE ONE. WHERE IS IT?
	MOVE	D,[OFILE,,A]
	BLT	D,D
	ENTER	1,A				;ENTER READ-ALTER MODE
	JRST	NOALT	

	INIT	0,13				;PTR IN BINARY MODE.
	'PTR   '
	IBUF
	JRST	NOPTR

	OUTSTR	[ASCIZ/Mount paper tape and type return when ready:
/]
	MOVEI	A,0
	PUSHJ	P,CLRIN

	MOVE	B,RIMPTR
	PUSHJ	P,TREAD				;READ IOWD FOR TAPE'S LOADER
	CAMLE	A,1(B)				;OK IF TAPE'S LOADER IS LONGER
	JRST	BADRIM				;BUT NOT IF SHORTER.
	MOVE	C,A				;IOWD FOR TAPE'S LOADER
	ADD	B,[1,,1]
RIMCHK:	PUSHJ	P,TREAD				;
	CAME	A,1(B)
	JRST	BADRIM				;TAPE ISN'T IN RIM FORMAT.
	ADD	C,[1,,1]
	AOBJN	B,RIMCHK			;LOOP, GOBBLING THE RIM10B LOADER.
	JUMPG	C,RIMOK				;JUMP IF TAPE'S IOWD IS COUNTED OUT
	PUSHJ	P,TREAD				;READ AND THROW OUT EXTRA WORDS
	AOBJN	C,.-1				;FROM THE TAPE'S LOADER.
RIMOK:	PUSHJ	P,FILINI
GETBLK:	PUSHJ	P,TREAD
	SKIPL	B,A				;SKIP IF THIS IS A POINTER WORD
	JRST	SSTART				;SET STARTING ADDRESS
	MOVE	CHK,B				;INITIALIZE CHECKSUM
RIMLP:	PUSHJ	P,TREAD
	ADD	CHK,A
	PUSHJ	P,FILSTR			;STORE IN FILE. DATA A IN LOC 1(B)
	AOBJN	B,RIMLP				;LOOP
	PUSHJ	P,TREAD				;READ CHECKSUM WORD
	CAMN	A,CHK
	JRST	GETBLK				;GET ANOTHER IOWD.
	OUTSTR	[ASCIZ/Checksum failure.
/]
	HALT	GETBLK

UNEOF:	OUTSTR	[ASCIZ/Unexpected End of File from PTR:
/]
	MOVEI	A,0				;STORE ZERO FOR THE STARTING ADDRE.
SSTART:	MOVE	B,HILOC				;GET HIGHEST LOC LOADED.
	HRLI	A,1(B)				;ONE BEYOND IS INITIAL JOBFF
	MOVEI	B,JOBSA-1
	PUSHJ	P,FILSTR
	PUSHJ	P,FILFRC
	CLOSE	1,
	RELEAS	1,
	RELEAS	0,
	JRST	BEGIN

BADRIM:	OUTSTR	[ASCIZ/Bad format RIM10B loader at the front of the tape?
/]
	JRST	BEGIN

PTRERR:	OUTSTR	[ASCIZ/PTR input error
/]
	GETSTS	0,A
	HALT	.+1
	SETSTS	0,10
TREAD:	SOSLE	IBUF+2
	JRST	TRED1
	INPUT	0,
	STATZ	0,20000
	JRST	[POP P,(P)
		JRST UNEOF]
	STATZ	0,740000
	JRST	PTRERR
TRED1:	ILDB	A,IBUF+1
	POPJ	P,

FILSTR:	MOVEI	C,1(B)			;C←ABSOLUTE ADDRESS.
	CAIN	C,36			;EXEC MODE JOBSYM?
	MOVEI	C,JOBSYM
	CAIN	C,41			;UUO TRAP?
	MOVEI	C,JOBS41		;YES.  HERE'S WHERE IT BELONGS IN DMP FORMAT
	CAMLE	C,HILOC			;IS THIS HIGHEST LOC LOADED THUS FAR?
	MOVEM	C,HILOC			;YES.  SAVE HIGHEST LOC LOADED.
	SUBI	C,74			;OFFSET TO DMP FILE ORIGIN=WORD # IN FILE.
	JUMPL	C,CPOPJ			;RETURN IF OFF THE FRONT.
	IDIVI	C,200			;BLOCK NUMBER-1 IN C, WORD NUMBER IN D.
	ADDI	C,1			;THIS IS THE USET POINTER
	CAIN	C,(BLK)			;SAME AS WHAT'S IN CORE?
	JRST	FILST2			;YES. - THIS IS THE EASY CASE.
FILST0:	PUSHJ	P,FILFRC		;FORCE CURRENT RECORD OUT.  ADVANCE TO NEXT
	CAIG	C,(LNG)			;IS DESIRED RECORD WITHIN EXISTING FILE?
	JRST	FILST1			;YES.  READ IT (UNLESS THE LAST RECORD)
	MOVEI	BLK,(LNG)		;SET TO APPEND A ZERO RECORD TO THE FILE.
	JRST	FILST0

FILST1:	MOVEI	BLK,(C)			;MAKE DESIRED RECORD THE CURRENT RECORD
	CAIL	BLK,(LNG)		;IS THIS THE NON-EX RECORD AT END OF FILE?
	JRST	FILST2			;YES.  WE CAN'T (AND DON'T NEED TO) READ IT.
	USETI	1,(BLK)
	INPUT	1,[-200,,DMPBUF-1
		0]
FILST2:	MOVEM	A,DMPBUF(D)		;STORE DATA
	POPJ	P,

FILINI:	MOVEI	BLK,1				;REC # THAT IS "IN CORE".
	MOVEI	LNG,1				;RECORD NUMBER OF EOF
	SETZM	HILOC				;HIGHEST LOCATION LOADED
FILCLR:	SETZM	DMPBUF
	PUSH	P,A
	MOVE	A,[DMPBUF,,DMPBUF+1]
	BLT	A,DMPBUF+177
APOPJ:	POP	P,A
CPOPJ:	POPJ	P,

FILFRC:	USETO	1,(BLK)				;SELECT OUTPUT RECORD ALWAYS
	OUTPUT	1,[-200,,DMPBUF-1		;WRITE CURRENT RECORD.
			0]
	ADDI	BLK,1
	CAMGE	LNG,BLK	
	MOVE	LNG,BLK				;INCREASE LNG IF INCREASING FILE.
	JRST	FILCLR				;NEXT RECORD NUMBER
;THINGS TO WRITE LATER:

GETFIL:	MOVE	A,['RIMOUT']
	MOVEM	A,(R)
	OUTSTR	[ASCIZ/RIMOUT.DMP
/]
	POPJ	P,

PTAPE:	OUTSTR	[ASCIZ/Not ready.
/]
	jrst	begin

END BEGIN